package com.siss.tenancy.util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;


/**
 * 对象转换成Map工具类
 * @author ygw
 *
 */

public class MapToBeanUtil {
	/**
	 * 
	 * @param type  转换成对象的类型
	 * @param map  被转换的 map集合;
	 * @return
	 * @throws IntrospectionException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws InvocationTargetException
	 */
	@SuppressWarnings("rawtypes")   
    public static Object convertMap(Class type, Map map)   
            throws IntrospectionException, IllegalAccessException,   
            InstantiationException, InvocationTargetException {   
        BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性   
        Object obj = type.newInstance(); // 创建 JavaBean 对象   
   
        // 给 JavaBean 对象的属性赋值   
        PropertyDescriptor[] propertyDescriptors =  beanInfo.getPropertyDescriptors();   
        for (int i = 0; i< propertyDescriptors.length; i++) {   
            PropertyDescriptor descriptor = propertyDescriptors[i];   
            String propertyName = descriptor.getName();   
   
            if (map.containsKey(propertyName)) {
            	   // 下面一句可以 try 起来，这样当一个属性赋值失败的时候就不会影响其他属性赋值。
                try {
					Object value = map.get(propertyName);   
					Object[] args = new Object[1];   
					args[0] = value;   
   
					descriptor.getWriteMethod().invoke(obj, args);
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}   
            }   
        }   
        return obj;   
    }  
	/**
	  * 将一个 JavaBean 对象转化为一个  Map
	     * @param bean 要转化的JavaBean 对象
	     * @return 转化出来的  Map 对象
	     * @throws IntrospectionException 如果分析类属性失败
	     * @throws IllegalAccessException 如果实例化 JavaBean 失败
	     * @throws InvocationTargetException 如果调用属性的 setter 方法失败
	     */
	    public static Map convertBean(Object bean)
	            throws IntrospectionException, IllegalAccessException, InvocationTargetException {
	        Class type = bean.getClass();
	        Map returnMap = new HashMap();
	        BeanInfo beanInfo = Introspector.getBeanInfo(type);
	        PropertyDescriptor[] propertyDescriptors =  beanInfo.getPropertyDescriptors();
	        for (int i = 0; i< propertyDescriptors.length; i++) {
	            PropertyDescriptor descriptor = propertyDescriptors[i];
	            String propertyName = descriptor.getName();
	            if (!propertyName.equals("class")) {
	                Method readMethod = descriptor.getReadMethod();
	                Object result = readMethod.invoke(bean, new Object[0]);
	                if (result != null) {
	                    returnMap.put(propertyName, result);
	                } else {
	                    returnMap.put(propertyName, "");
	                }
	            }
	        }
	        return returnMap;
	    }
//	    @Test
//	    public void aa() throws IllegalAccessException, InstantiationException, InvocationTargetException, IntrospectionException{
//               Map hashMap = new HashMap<>();
//               hashMap.put( "id","i100");
//               hashMap.put("platId","11");
//               hashMap.put("columnId","正普云");
//               hashMap.put("type","1");
//               hashMap.put("title","标题1");
//               hashMap.put("link","www.baidu.com");
//               hashMap.put("aaa","cccc");
//               Info convertMap = (Info)convertMap(Info.class, hashMap);
//               
//               System.out.println(convertMap.toString());
//               System.out.println("a");
//	    }
	    
	
}
